home *** CD-ROM | disk | FTP | other *** search
- #ifdef THINK_C
- #include <LoMem.h>
- #include <THINK.h>
- #define get_time() TimeLM
- #define get_ticks() Ticks
- #else
- #include <Types.h>
- #include <Errors.h>
- #include <Memory.h>
- #include <OSUtils.h>
- #include <SegLoad.h>
- #include <Quickdraw.h>
- #include <Files.h>
- #include <Menus.h>
- #include <Fonts.h>
- #include <Resources.h>
- #include <GestaltEqu.h>
- #include <Traps.h>
- #include <Aliases.h>
- #include <Packages.h>
- #include <Processes.h>
- #include <AppleEvents.h>
- #include <ToolUtils.h>
- #include <SysEqu.h>
- #define get_time() (*(long *)TimeLM)
- #define get_ticks() (*(long *)Ticks)
- enum {FALSE,TRUE};
- #endif
- #include <Dialogs.h>
- #include <GestaltEqu.h>
- #include <StandardFile.h>
- #include <Memory.h>
- #include "proc_mmu.h"
-
- #define TrapMask 0x0800
-
- static short NumToolboxTraps( void )
- {
- if (GetToolTrapAddress(0xA86E) ==
- GetToolTrapAddress(0xAA6E))
- return(0x0200);
- else
- return(0x0400);
- }
-
- static TrapType GetTrapType(short theTrap)
- {
-
- if ((theTrap & TrapMask) > 0)
- return(ToolTrap);
- else
- return(OSTrap);
-
- }
-
- Boolean TrapAvailable(short theTrap)
- {
-
- TrapType tType;
-
- tType = GetTrapType(theTrap);
- if (tType == ToolTrap)
- theTrap = theTrap & 0x07FF;
- if (theTrap >= NumToolboxTraps())
- theTrap = 0xA89F;
-
- return ((tType == ToolTrap?GetToolTrapAddress(theTrap):GetOSTrapAddress(theTrap))!=
- GetToolTrapAddress(0xA89F));
- }
-
- #ifdef PROTECTED
- long mmutype;
- int virtual = 0;
- #endif
-
- int get_page_size(void)
- {
- long gestaltAnswer;
- Gestalt(gestaltLogicalPageSize, &gestaltAnswer);
- #ifdef PROTECTED
- if (virtual)
- #endif
- {
- return gestaltAnswer;
- }
- #ifdef PROTECTED
- switch(mmutype)
- {
- case gestalt68030MMU:
- return 1<<((get_68030_tc()>>20)&15);
- break;
- case gestalt68040MMU:
- return get_68040_tc()&16384?8192:4096;
- break;
- default:
- return gestaltAnswer;
- }
- #endif
- }
-
- void probe()
- {
- unsigned short status;
- Str255 name,name2;
- int major = 5,minor,cnt;
- long gestaltAnswer,physram,logram;
- if (TrapAvailable(0xA1AD))
- {
- Gestalt(gestaltSystemVersion, &gestaltAnswer);
- major = gestaltAnswer>>8;
- minor = gestaltAnswer&255;
- }
- if (major < 7)
- {
- ParamText((unsigned char *)"\p, Sorry, System 7 required",0,0,0);
- Alert(129, 0);
- ExitToShell();
- }
- #ifdef PROTECTED
- Gestalt(gestaltMMUType, &mmutype);
- if ((mmutype != gestalt68030MMU) && (mmutype != gestalt68040MMU))
- #if 1
- mmutype = -1;
- #else
- {
- ParamText("\pSorry, Only the 68030/68040","\pMMUs are supported","\pin this version",0);
- Alert(129, 0);
- ExitToShell();
- }
- #endif
- Gestalt(gestaltAddressingModeAttr, &gestaltAnswer);
- if (~gestaltAnswer & ((1<<gestalt32BitAddressing)|(1<<gestalt32BitSysZone)|(1<<gestalt32BitCapable)))
- {
- ParamText("\pIdeally, you should","\pReboot in 32-bit mode",0,0);
- Alert(129, 0);
- // ExitToShell();
- }
- #endif
- #if 0
- Gestalt(gestaltLogicalPageSize, &gestaltAnswer);
- if (gestaltAnswer != 8192)
- {
- ParamText("\pSupport for page sizes","\pother than 8K is untested","\pcontinue at your own risk!",0);
- Alert(129, 0);
- }
- #else
- Gestalt(gestaltMMUType, &gestaltAnswer);
- switch(gestaltAnswer)
- {
- int vec[2];
- case gestalt68030MMU:
- if (get_68030_tc()&(1<<25)) /* only initialise CRP if SRP in use! */
- {
- get_68030_srp(vec);
- put_68030_crp(vec);
- }
- break;
- case gestalt68040MMU:
- get_68040_srp(vec);
- put_68040_crp(vec);
- break;
- }
- #endif
- #if 1
- asm {
- move.w sr,status
- };
- if (~status & 0x2000)
- #else
- Gestalt(gestaltLogicalRAMSize, &logram);
- Gestalt(gestaltPhysicalRAMSize, &physram);
- if (logram > physram)
- #endif
- {
- ParamText("\pSorry, virtual memory","\pis not supported","\pin this version",0);
- Alert(129, 0);
- ExitToShell();
- }
- #if 0
- Gestalt(gestaltMachineType, &gestaltAnswer);
- GetIndString(name, kMachineNameStrID, gestaltAnswer);
- cnt = 0;
- do
- {
- GetIndString(name2, 128, ++cnt);
- if (!memcmp(name, name2, *name)) gestaltAnswer = 0;
- }
- while (*name2 && gestaltAnswer);
- if (gestaltAnswer)
- {
- ParamText("\pThis program is untested on",name,"\pdon't blame me","\pif it crashes");
- Alert(129, 0);
- }
- #endif
- page_size = get_page_size();
- // for (ccnt = 8; ccnt--; ) nxt[ccnt] = (CursHandle)GetCursor(128+ccnt);
- // InstallVBL();
- patch_traps();
- old_ticks = get_ticks();
- }
-
- long trap_patch_0()
- {
- #ifdef PROTECTED
- switch(mmutype)
- {
- case gestalt68030MMU:
- return (long)trap_patch_68030_0;
- break;
- case gestalt68040MMU:
- return (long)trap_patch_68040_0;
- break;
- default:
- #else
- {
- #endif
- return (long)trap_patch_68020_0;
- }
- }
-
- long trap_patch_1()
- {
- #ifdef PROTECTED
- switch(mmutype)
- {
- case gestalt68030MMU:
- return (long)trap_patch_68030_1;
- break;
- case gestalt68040MMU:
- return (long)trap_patch_68040_1;
- break;
- default:
- #else
- {
- #endif
- return (long)trap_patch_68020_1;
- }
- }
-
- #ifdef PROTECTED
-
- long get_user_root()
- {
- long vec[2];
- switch(mmutype)
- {
- case gestalt68030MMU:
- get_68030_crp(vec);
- return vec[1];
- break;
- case gestalt68040MMU:
- get_68040_crp(vec);
- return vec[1];
- break;
- default:
- return 0;
- }
- }
-
- long get_supervisor_root()
- {
- long vec[2];
- switch(mmutype)
- {
- case gestalt68030MMU:
- get_68030_srp(vec);
- return vec[1];
- break;
- case gestalt68040MMU:
- get_68040_srp(vec);
- return vec[1];
- break;
- default:
- return 0;
- }
- }
-
- void put_user_root(struct mmu *rootptr)
- {
- long addr = (long)rootptr;
- long vec[2];
- if (virtual) return;
- #if 0
- if (!rootptr->sbreak)
- {
- addr = get_supervisor_root();
- }
- #endif
- switch(mmutype)
- {
- case gestalt68030MMU:
- get_68030_crp(vec);
- vec[1] = addr;
- put_68030_crp(vec);
- break;
- case gestalt68040MMU:
- vec[1] = addr;
- put_68040_crp(vec);
- break;
- }
- }
-
- void flush_caches()
- {
- switch(mmutype)
- {
- case gestalt68030MMU:
- flush_68030_caches();
- break;
- case gestalt68040MMU:
- flush_68040_caches();
- break;
- }
- }
-
- void flush_mmu_caches()
- {
- switch(mmutype)
- {
- case gestalt68030MMU:
- flush_68030_mmu_caches();
- break;
- case gestalt68040MMU:
- flush_68040_mmu_caches();
- break;
- }
- }
-
- void *logical_to_physical(struct mmu *crp, unsigned long addr)
- {
- switch(mmutype)
- {
- case gestalt68030MMU:
- {
- long level2 = crp->u.u3.level2[(addr>>22)&1023]&~255;
- if ((level2 >= (long)(crp->u.u3.level3))
- && (level2 < sizeof(crp->u.u3.level3)+(long)(crp->u.u3.level3)))
- {
- long level3 = ((long *)level2)[(addr&((1<<22)-1))/page_size]&~255;
- if (level3)
- return (void *)(level3+(addr&(page_size-1)));
- }
- }
- break;
- case gestalt68040MMU:
- {
- long level1 = crp->u.u4.level1[addr>>25]&~255;
- if
- (
- (level1 >= (long)(crp->u.u4.level2)
- )
- &&
- (level1 < sizeof(crp->u.u4.level2)+(long)(crp->u.u4.level2)
- )
- )
- {
- long level2 = ((long *)level1)[(addr>>18)&127]&~255;
- if ((level2 >= (long)(crp->u.u4.level3))
- && (level2 < sizeof(crp->u.u4.level3)+(long)(crp->u.u4.level3)))
- {
- long level3 = ((long *)level2)[(addr&((1<<18)-1))/page_size]&~255;
- if (level3)
- return (void *)(level3+(addr&(page_size-1)));
- }
- }
- return((void *)-1);
- }
- break;
- }
- return((void *)-1);
- }
-
- int upper_space(struct mmu *crp, long size)
- {
- long addr,level2;
- switch(mmutype)
- {
- case gestalt68030MMU:
- {
- for (level2 = 8; level2--; )
- {
- for (addr = (1<<22)/page_size; addr--; )
- {
- if (!crp->u.u3.level3[level2][addr])
- {
- long page = page_alloc();
- if (page) crp->u.u3.level3[level2][addr] = 0x1 + page;
- else return -1;
- }
- size -= page_size;
- if (size <= 0) return 0;
- }
- }
- return -1;
- }
- case gestalt68040MMU:
- {
- for (level2 = 128; level2--; )
- {
- for (addr = (1<<18)/page_size; addr--; )
- {
- if (!crp->u.u4.level3[level2][addr])
- {
- long page = page_alloc();
- if (page) crp->u.u4.level3[level2][addr] = 0x39 + page;
- else return -1;
- }
- size -= page_size;
- if (size <= 0) return 0;
- }
- }
- return -1;
- }
- }
- }
-
- int lower_space(struct mmu *crp, long size)
- {
- long addr,level2;
- switch(mmutype)
- {
- case gestalt68030MMU:
- {
- for (level2 = 0; level2 < 8; level2++)
- {
- for (addr = 0; addr < (1<<22)/page_size; addr++)
- {
- if (!crp->u.u4.level3[level2][addr])
- {
- long page = page_alloc();
- if (page) crp->u.u3.level3[level2][addr] = 0x1 + page;
- else return -1;
- }
- size -= page_size;
- if (size <= 0) return 0;
- }
- }
- return -1;
- }
- case gestalt68040MMU:
- {
- for (level2 = 0; level2 < 128; level2++)
- {
- for (addr = 0; addr < (1<<18)/page_size; addr++)
- {
- if (!crp->u.u4.level3[level2][addr])
- {
- long page = page_alloc();
- if (page) crp->u.u4.level3[level2][addr] = 0x39 + page;
- else return -1;
- }
- size -= page_size;
- if (size <= 0) return 0;
- }
- }
- return -1;
- }
- default:
- return -1;
- }
- }
-
- int supervisor_space(struct mmu *crp, long lower, long upper)
- {
- long addr,level2;
- for (level2 = 0; level2 < 128; level2++)
- {
- for (addr = 0; addr < (1<<18)/page_size; addr++)
- {
- long addr2 = (level2<<18) + addr*page_size;
- if ((addr2 >= lower-page_size) && (addr2 <= upper))
- {
- crp->u.u4.level3[level2][addr] = 0x39 + addr2;
- }
- if (addr2 > upper) return 0;
- }
- }
- return -1;
- }
-
- void free_space(struct mmu *crp)
- {
- long addr,level2;
- flush_caches();
- switch(mmutype)
- {
- case gestalt68030MMU:
- {
- for (level2 = 0; level2 < 8; level2++)
- {
- for (addr = 0; addr < (1<<22)/page_size; addr++)
- {
- page_free(crp->u.u3.level3[level2][addr]&~255);
- }
- }
- }
- break;
- case gestalt68040MMU:
- {
- for (level2 = 0; level2 < 128; level2++)
- {
- for (addr = 0; addr < (1<<18)/page_size; addr++)
- {
- page_free(crp->u.u4.level3[level2][addr]&~255);
- }
- }
- }
- break;
- }
- if (!crp->sbreak) /* must be relocatable */
- {
- struct mem_chain *storage = crp->storage;
- while (storage)
- {
- struct mem_chain *nxt = storage->nxt;
- DisposPtr((Ptr)storage);
- storage = nxt;
- }
- }
- }
-
- void wipeout(struct mmu *crp)
- {
- long addr;
- switch(mmutype)
- {
- case gestalt68030MMU:
- {
- for (addr = 0; addr < 8; addr++)
- {
- crp->u.u3.level2[addr] = 0xA + (long)&(crp->u.u3.level3[addr][0]);
- }
- }
- break;
- case gestalt68040MMU:
- {
- for (addr = 0; addr < 128; addr++)
- {
- crp->u.u4.level1[addr] = 0x18;
- crp->u.u4.level2[addr] = 0xA + (long)&(crp->u.u4.level3[addr][0]);
- }
- crp->u.u4.level1[0] = 0xA + (long)(crp->u.u4.level2);
- }
- break;
- }
- }
-
- #endif